package dmir.wikipedia.cleaners;


import java.util.regex.Pattern;
import dmir.wikipedia.addons.PortugueseWikiAreaUtil;
import dmir.wikipedia.addons.PortugueseWikiCoordinatesUtil;
import dmir.wikipedia.addons.PortugueseWikiPopulationUtil;

public class PortugueseWikiPageCleaner extends AbstractWikiPageCleaner {
    
	
    public PortugueseWikiPageCleaner(String title, StringBuilder rawText) {
    	super(title, rawText);
    }



	@Override
	protected Pattern getDisambTemplatePattern() 
	{
		return Pattern.compile("\\{\\{desambigua..o\\}\\}");
	}



	@Override
	protected Pattern getRedirectPattern() 
	{
		return Pattern.compile("#(REDIRECT|REDIRECIONAMENTO)\\s*\\[\\[\\s*(.+)\\s*\\]\\]", Pattern.CASE_INSENSITIVE);
	}



	@Override
	protected Pattern getMediaLinksPattern() 
	{
		return Pattern.compile("(\\[\\[(Ficheiro:|File:|Image:|Imagem:)?)|(\\]\\])", Pattern.CASE_INSENSITIVE);
	}



	@Override
	protected Pattern getCategoryPattern() 
	{
		return Pattern.compile("Categoria:(.+)");
	}



	@Override
	protected Pattern getSpecialPattern() 
	{
		return Pattern.compile(
						"(((Lists_of_)|(Listas_de_)|(Lista_de_)|(List_of_)|(Tabela_de_)|(Table_of_)|(Media:)|(File:)" +
						"|(Ficheiro:)|(Imagem:)|(Image:)|(Wikip.dia:)|(MediaWiki:)|(Predefini..o:)|(Anexo:)|(Template:)|(Index_of_)" +
						"|(Especial:)|(Usu.rio:)|(User:)|(Ajuda:)|(Manual:)|(Wikt:)|(Wiktionary:)|(Wikinews:)|(Portal:)|(Livro:)" +
						WIKIPEDIA_LANGUAGE_PREFIXES + ").+)" +
						"|(.*#.+)|(.+\\(desambiguação\\))|(.+\\(disambiguation\\))\\s", Pattern.CASE_INSENSITIVE);
	}



	@Override
	public boolean isMediaLink(String text) 
	{
		return text.startsWith("[[Ficheiro:") 
    			|| text.startsWith("[[File:") 
    			|| text.startsWith("[[Image:")
    			|| text.startsWith("[[Imagem:");
	}



	@Override
	protected Pattern getIgnoreTitlePattern() 
	{
		return Pattern.compile(
	            "(Anexo:)|(MediaWiki:)|(Predefini..o:)|(Listas_de_)|(Lista_de_)|(Tabela_de_)|(Ficheiro:)|(Imagem:)|(Media:)|(Wikip.dia:)|(Categoria:)|(Livro:)" +
	            "|(Especial:)|(User:)|(Usu.rio:)|(Ajuda:)|(Manual:)|(Template:)|(Wikt:)|(Wiktionary:)|(Wikinews:)|(Portal:)|(\\(desambigua..o\\))",
	            Pattern.CASE_INSENSITIVE);
	}



	@Override
	protected Pattern getDisambTitlePattern() 
	{
		return Pattern.compile("(desambiguação)");
	}

	@Override
    	public Double[] getLatLng() {
  	      if (latLng == null) latLng = PortugueseWikiCoordinatesUtil.INSTANCE.getCoordinates(getInfobox());
              return latLng;
    	}

	@Override    
	public Long getPopulation() {
	    	return PortugueseWikiPopulationUtil.INSTANCE.getPopulation(getInfobox());
	}

	@Override    
	public Float getArea() {
	    	return PortugueseWikiAreaUtil.INSTANCE.getArea(getInfobox());
	}

}
